/**
 * 给一个树，从树根开始，两人轮流走棋。
 * 令当前位置为u，则可以走到u子树的任意子孙节点，并且获取该节点的权值
 * 先手得分记作A，后手得分记作B，
 * 问最佳策略下，A-B最大是多少
 * 令Di是i子树能够得到的最大值, Ui是选i能够得到的最大值
 * 对于Ui而言，博弈论必然是负值最大函数，因此
 * Ui = max{Wi - Dson, son是i的儿子}
 * Di = max(Ui, max{Dson, son是i的儿子})
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vvi = vector<vi>;

int N;
vvi G;
vector<llt> W;
vector<array<llt, 2>> D;

void dfs(int u, int p){
    auto & a = D[u];
    for(auto v : G[u]){
        dfs(v, u);
        a[0] = max(a[0], D[v][0]);
        a[1] = max(a[1], D[v][0]);
    }
    a[0] = max(a[0], W[u] - a[1]);
    return;
}

llt proc(){
    D.assign(N + 1, {0LL, 0LL});
    dfs(1, 0);
    return D[1][0];
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int nofkase; cin >> nofkase;
    while(nofkase--){
        cin >> N;
        W.assign(N + 1, 0);
        G.assign(N + 1, {});
        for(int i=2;i<=N;++i) cin >> W[i];
        for(int p,i=2;i<=N;++i){
            cin >> p;
            G[p].push_back(i);
        }
        cout << proc() << endl;
    }
    return 0;
}